﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Servicios;
using Dominio;
using Indices;
using Excepciones;
using UI.Miembros;
using System.IO;

namespace UI
{
    public partial class Busquedas : System.Web.UI.Page
    {
        IIndexManager indiceManager = FabricaDeIndices.ObtenerInstancia().ObtenerIndexManager();

        IBusquedaService servicioBusqueda = FabricaDeServicios.ObtenerInstancia().ObtenerBusquedaService();


        protected void Page_Load(object sender, EventArgs e)
        {

            if (Session[ConstantesDeSesion.Usuario] != null)
            {
                Usuario usuario = (Usuario)Session[ConstantesDeSesion.Usuario];
                CheckBox_guardar.Visible = !((Security)Session[ConstantesDeSesion.Security]).RolPermitido(usuario.Rol, ConstantesFuncionalidades.BusquedasVisitante);
                PanelBusquedasViejas.Visible = !((Security)Session[ConstantesDeSesion.Security]).RolPermitido(usuario.Rol, ConstantesFuncionalidades.BusquedasVisitante);
                if (((Security)Session[ConstantesDeSesion.Security]).RolPermitido(usuario.Rol, ConstantesFuncionalidades.Busquedas))
                {
                    if (!IsPostBack)
                    {
                        if (PanelBusquedasViejas.Visible)
                        {
                            this.RecargarBusquedasAnteriores();
                        }
                    }
                }
                else
                {
                    //Usuario  no autorizado
                    WebUtils.MsgBox("Usuario no Autorizado");
                    Response.Redirect("~/Miembros/Busquedas.aspx");
                }
            }
            else
            {
                //Usuario no autenticado
                WebUtils.MsgBox("Usuario no Autenticado");
                Response.Redirect("~/Login.aspx");
            }
        }

        protected void Button_buscar_Click(object sender, EventArgs e)
        {
           string texto = TextB_texto.Text.Trim();
            List<FileSystemElementDTO> elementos = new List<FileSystemElementDTO>();
            if (texto != "")
            {
                try
                {
                    foreach (FileSystemElement fse in this.indiceManager.Buscar(texto, ((Usuario)Session[ConstantesDeSesion.Usuario]).NombreUsuario))
                    {
                        FileSystemElementDTO fseDTO = new FileSystemElementDTO() 
                                                            { 
                                                                Ruta = fse.Ruta,//.Replace("//","\\\\"), 
                                                                Nombre = fse.Nombre, 
                                                                Fecha = fse.Fecha,
                                                                ArchivoRuta = fse.ObtenerLink
                                                            };
                        if (!(fse is Archivo))
                        {
                            fseDTO.ArchivoRuta = "";
                            fseDTO.DirectorioRuta = fse.ObtenerLink;
                        }
                        else
                        {
                            fseDTO.DirectorioRuta = fse.Ruta;
                        }
                        elementos.Add(fseDTO);
                    }

                    if (CheckBox_guardar.Checked)//Si selecciono guardar busqueda, la guardamos.
                    {
                        Busqueda busqueda = new Busqueda();
                        busqueda.Keyword = texto;
                        busqueda.Usuario = (Usuario)Session[ConstantesDeSesion.Usuario];
                        this.servicioBusqueda.Registrar(busqueda);
                        this.RecargarBusquedasAnteriores();
                    }

                }
                catch (DataBaseException ex)
                {
                    WebUtils.MsgBox(ex.Message);
                }
                catch (Exception ex)
                {
                    WebUtils.MsgBox(ConstantesDeMensajes.ErrorInterno);
                }
                GridView1.DataSource = elementos;

            }
            else
            {
                WebUtils.MsgBox("No hay elementos para la busqueda realizada");
            }
            GridView1.DataBind();

        }

        protected void ListB_busquedas_Select(object sender, EventArgs e)
        {
            if (ListB_busquedas.SelectedValue != ConstantesDeMensajes.SeleccionDummy)
            {
                TextB_texto.Text = ListB_busquedas.SelectedValue;
            }
        }

        protected void ButtonEliminarBusqueda_Click(object sender, EventArgs e)
        {
            if (ListB_busquedas.SelectedValue != ConstantesDeMensajes.SeleccionDummy)
            {
                try
                {
                    Busqueda busquedaAEliminar = null;
                    foreach (Busqueda b in servicioBusqueda.ObtenerBusquedasDelUsuario(((Usuario)Session[ConstantesDeSesion.Usuario]).Id))
                    {
                        if (b.Keyword.Equals(ListB_busquedas.SelectedValue))
                        {
                            busquedaAEliminar = b;
                            break;
                        }
                    }
                    if (busquedaAEliminar != null)
                    {
                        servicioBusqueda.Borrar(busquedaAEliminar);
                        RecargarBusquedasAnteriores();
                        WebUtils.MsgBox("Busqueda eliminada correctamente");
                    }
                    else
                    {
                        WebUtils.MsgBox("La busqueda a eliminar es invalida");
                    }

                }
                catch (Exception ex)
                {
                    WebUtils.MsgBox(ConstantesDeMensajes.ErrorInterno);
                }
            }
        }

        private void RecargarBusquedasAnteriores()
        {

            ListB_busquedas.Items.Clear();
            ListB_busquedas.DataSource = servicioBusqueda.ObtenerBusquedasDelUsuario(((Usuario)Session[ConstantesDeSesion.Usuario]).Id);
            ListB_busquedas.DataBind();
        }

        protected void gridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                Label tam = (Label)e.Row.FindControl("tamanoLabel");
                
                FileSystemInfo fileSystemInfo = (FileSystemInfo)e.Row.DataItem;
                
                string ruta = ObtenerRuta(fileSystemInfo.FullName);
               
                FileSystemElement fe = FabricaDeServicios.ObtenerInstancia().ObtenerFileSystemElementService().ObtenerPorRuta(ruta);
                tam.Text = fe.GetTamanio()+" B";
            }
        }
        private string ObtenerRuta(string path)
        {
            string ruta = path.Replace("\\", "/");
            return ruta;
        }
        protected void gridView_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            //Ejecutamos el comando
            ImageButton fileSystemTypeButton = (ImageButton)e.CommandSource;
            ExecuteButtonAction(fileSystemTypeButton);
        }
        private void ExecuteButtonAction(IButtonControl buttonControl)
        {
            if (buttonControl.CommandName == "Archivo")
            {
                //Si el usuario cliqueo un archivo significa que quiere abrirlo
                System.Diagnostics.Process.Start("explorer", "file://" + buttonControl.CommandArgument);
            }
            else
            {
                string carpetaPath = buttonControl.CommandArgument.Remove(buttonControl.CommandArgument.LastIndexOf('/'));
                System.Diagnostics.Process.Start("explorer", "file://" + carpetaPath);
                
                //string carpetaPath = buttonControl.CommandArgument.Remove(buttonControl.CommandArgument.LastIndexOf('/'));
                //System.Diagnostics.Process.Start("explorer", "file://" + carpetaPath);

            }
        }

        private void AbrirDirectorio(string path)
        {
            System.Diagnostics.ProcessStartInfo exploreInfo = new System.Diagnostics.ProcessStartInfo();
            exploreInfo.FileName = "explorer.exe";
            exploreInfo.Arguments = path;//Server.MapPath(path);
            System.Diagnostics.Process.Start(exploreInfo); 
        }


        private void AbrirArchivo(string path)
        {
            //obtenemos el nombre del archivo
            string ext = Path.GetExtension( path );
            string nomArch = Path.GetFileNameWithoutExtension( path );
            Response.ClearContent();
            Response.ContentType = ObtenerContentType(path);
            Response.Headers.Add("Content-Disposition", "Attachment;Filename=" + nomArch + ext);
            //Response.AddHeader( "Content-Disposition", "Attachment;Filename="  + nomArch + ext );
            Response.TransmitFile( path );
            Response.End();
        }
            
        private string ObtenerContentType(string path)
        {
            FileInfo file = new FileInfo(path);
            switch (file.Extension)
            {
                case ".pdf":
                    return "application/pdf";
                    break;
                case ".doc":
                    return "application/msword";
                    break;
                case ".xml": return "application/xml";
                    break;
            default:
                    return "application/octet-stream";

            }
            throw new NotImplementedException();
        }
    }

    class FileSystemElementDTO
    {
        public string Ruta { get; set; }


        public string Nombre
        {
            get;

            set;
        }
        public DateTime Fecha { get; set; }

        public string DirectorioRuta { get; set; }
        public string ArchivoRuta { get; set; }
        public string Tamano
        {
            get
            {
                FileSystemElement fe = FabricaDeServicios.ObtenerInstancia().ObtenerFileSystemElementService().ObtenerPorRuta(this.Ruta+"/"+this.Nombre);
                return fe.GetTamanio() + " B";
            }
        }
    }


}